{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "b1c259c5",
   "metadata": {},
   "source": [
    "### 高等数学复习笔记 - 中值定理 （高等数学第三章 p125）"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "04008207",
   "metadata": {},
   "source": [
    "高等数学中的中值定理是微积分学中的核心定理之一，主要包括以下几个部分：\n",
    "\n",
    "1. **罗尔定理（Rolle's Theorem）**：\n",
    "   - 如果函数$f(x)$在闭区间$[a, b]$上连续，在开区间$(a, b)$内可导，且$f(a) = f(b)$，则至少存在一点$c \\in (a, b)$，使得$f'(c) = 0$。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4a78d48c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sympy as sp\n",
    "\n",
    "# 定义变量\n",
    "x = sp.symbols('x')\n",
    "a, b, c = sp.symbols('a b c', real=True, positive=True) # 假设a < b\n",
    "\n",
    "# 选择一个具体的函数，例如f(x) = x^3 - 3x\n",
    "f = x**3 - 3*x\n",
    "\n",
    "# 计算f在a和b处的值\n",
    "f_a = f.subs(x, a)\n",
    "f_b = f.subs(x, b)\n",
    "\n",
    "# 计算f的导数\n",
    "f_prime = sp.diff(f, x)\n",
    "\n",
    "# 根据罗尔定理，如果f(a) = f(b)，则存在c ∈ (a, b)使得f'(c) = 0\n",
    "# 我们先假设f(a) = f(b)来找到这样的a和b（这通常是一个特殊情况）\n",
    "# 或者，我们可以选择一个已知的满足f(a) = f(b)的a和b值\n",
    "# 例如，对于f(x) = x^3 - 3x，我们知道f(1) = f(-1) = -2\n",
    "# 所以我们可以设置a = -1, b = 1（注意这里a和b不是变量，而是具体的数值）\n",
    "a_value = -1\n",
    "b_value = 1\n",
    "\n",
    "# 验证f(a) = f(b)\n",
    "assert f_a.subs(a, a_value) == f_b.subs(b, b_value), \"f(a) != f(b), choose different a and b or function f\"\n",
    "\n",
    "# 现在我们需要找到c ∈ (a_value, b_value)使得f'(c) = 0\n",
    "# 解方程f'(x) = 0\n",
    "solutions = sp.solve(f_prime, x)\n",
    "\n",
    "# 筛选出位于(a_value, b_value)区间内的解\n",
    "valid_solutions = [sol for sol in solutions if a_value < sol < b_value]\n",
    "\n",
    "# 打印结果\n",
    "print(f\"The derivative f'(x) = {f_prime}\")\n",
    "print(f\"The solutions to f'(x) = 0 are {solutions}\")\n",
    "print(f\"The valid solution(s) in the interval ({a_value}, {b_value}) are {valid_solutions}\")\n",
    "\n",
    "# 对于这个特定的函数和区间，我们应该找到一个解c = 0，它满足罗尔定理"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b4024806",
   "metadata": {},
   "source": [
    "2. **拉格朗日中值定理（Lagrange's Mean Value Theorem）**：\n",
    "   - 如果函数$f(x)$在闭区间$[a, b]$上连续，在开区间$(a, b)$内可导，则在开区间$(a, b)$内至少存在一点$c$，使得$f'(c) = \\frac{f(b) - f(a)}{b - a}$。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "be83dbe6",
   "metadata": {},
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'sympy'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[8], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01msympy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01msp\u001b[39;00m\n\u001b[0;32m      3\u001b[0m \u001b[38;5;66;03m# 定义变量和函数\u001b[39;00m\n\u001b[0;32m      4\u001b[0m x \u001b[38;5;241m=\u001b[39m sp\u001b[38;5;241m.\u001b[39msymbols(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mx\u001b[39m\u001b[38;5;124m'\u001b[39m)\n",
      "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'sympy'"
     ]
    }
   ],
   "source": [
    "import sympy as sp\n",
    "\n",
    "# 定义变量和函数\n",
    "x = sp.symbols('x')\n",
    "a, b, c = sp.symbols('a b c', real=True, positive=True) # 假设a, b, c为正实数\n",
    "f = x**2  # 选择一个简单的二次函数作为例子\n",
    "\n",
    "# 计算f(a)和f(b)\n",
    "f_a = f.subs(x, a)\n",
    "f_b = f.subs(x, b)\n",
    "\n",
    "# 计算f'(x)\n",
    "f_prime = sp.diff(f, x)\n",
    "\n",
    "# 求解f'(c) = (f(b) - f(a)) / (b - a)\n",
    "# 即 c**2 - a**2 - b**2 + (a**2 - b**2) * c / (b - a) = 0\n",
    "# 简化后得到 c**2 - (a + b)c + ab = 0\n",
    "# 这是一个关于c的二次方程，其解为c = (a + b)/2（因为只有一个c在(a, b)内）\n",
    "c_value = (a + b) / 2\n",
    "\n",
    "# 验证f'(c_value)是否等于(f(b) - f(a)) / (b - a)\n",
    "f_prime_c = f_prime.subs(x, c_value)\n",
    "slope = (f_b - f_a) / (b - a)\n",
    "\n",
    "# 打印结果\n",
    "print(f\"f'(c_value) = {f_prime_c}\")\n",
    "print(f\"slope = {slope}\")\n",
    "\n",
    "# 由于我们选择了f(x) = x**2，这是一个简单的二次函数，其导数f'(x) = 2x是线性的\n",
    "# 因此，对于任意的a和b，f'((a + b)/2)都会等于(f(b) - f(a)) / (b - a)\n",
    "# 这验证了拉格朗日中值定理在这个特定例子中的正确性"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "43592e2f",
   "metadata": {},
   "source": [
    "3. **柯西中值定理（Cauchy's Mean Value Theorem）**：\n",
    "   - 如果函数$f(x)$和$g(x)$在闭区间$[a, b]$上连续，在开区间$(a, b)$内可导，且$g'(x) \\neq 0$，则在开区间$(a, b)$内至少存在一点$c$，使得$\\frac{f'(c)}{g'(c)} = \\frac{f(b) - f(a)}{g(b) - g(a)}$。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "759847dd",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sympy as sp\n",
    "\n",
    "# 定义变量\n",
    "x = sp.symbols('x')\n",
    "a, b, c = sp.symbols('a b c', real=True, positive=True, ordered=True) # 假设a < b < c是顺序的，但这里c不用作解，仅为了保持符号一致性\n",
    "\n",
    "# 选择两个具体的函数，例如f(x) = x^2和g(x) = x\n",
    "f = x**2\n",
    "g = x\n",
    "\n",
    "# 计算f和g在a和b处的值\n",
    "f_a, g_a = f.subs(x, a), g.subs(x, a)\n",
    "f_b, g_b = f.subs(x, b), g.subs(x, b)\n",
    "\n",
    "# 计算f和g的导数\n",
    "f_prime = sp.diff(f, x)\n",
    "g_prime = sp.diff(g, x)\n",
    "\n",
    "# 根据柯西中值定理，存在c ∈ (a, b)使得[f(b) - f(a)] / [g(b) - g(a)] = f'(c) / g'(c)\n",
    "# 我们先计算[f(b) - f(a)] / [g(b) - g(a)]\n",
    "slope_fg = (f_b - f_a) / (g_b - g_a)\n",
    "\n",
    "# 现在我们需要找到c ∈ (a, b)使得f'(c) / g'(c) = slope_fg\n",
    "# 解方程f'(x) / g'(x) = slope_fg，即f'(x) - slope_fg * g'(x) = 0\n",
    "equation = f_prime - slope_fg * g_prime\n",
    "\n",
    "# 解这个方程找到c的值\n",
    "# 注意：由于我们是在符号域中工作，这个方程可能有多个解，包括不在区间(a, b)内的解\n",
    "# 我们需要筛选出位于(a, b)区间内的解\n",
    "solutions = sp.solve(equation, x)\n",
    "valid_solutions = [sol for sol in solutions if a < sol < b]\n",
    "\n",
    "# 打印结果\n",
    "print(f\"The derivatives are f'(x) = {f_prime} and g'(x) = {g_prime}\")\n",
    "print(f\"The slope of the secant line through (a, f(a)) and (b, f(b)) relative to (a, g(a)) and (b, g(b)) is {slope_fg}\")\n",
    "print(f\"The equation to solve is f'(x) / g'(x) = {slope_fg}, which simplifies to {equation} = 0\")\n",
    "print(f\"The solutions to the equation are {solutions}\")\n",
    "print(f\"The valid solution(s) in the interval ({a}, {b}) are {valid_solutions}\")\n",
    "\n",
    "# 对于这个特定的函数和区间，我们应该能够找到一个解c ∈ (a, b)，它满足柯西中值定理的条件\n",
    "# 但是，请注意，由于我们是在符号域中工作，并且没有为a和b指定具体的数值，\n",
    "# 因此`sympy`可能会返回包含复杂表达式的解，或者可能无法直接确定哪个解是有效的。\n",
    "# 在实际应用中，我们通常需要为a和b指定具体的数值，并检查返回的解是否在区间内。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2799ac92",
   "metadata": {},
   "source": [
    "**4.费马定理**\n",
    "\n",
    "设函数 **y = f(x)** 在点 **x₀** 处可导。若 **x₀** 是函数的极值点，则 **f'(x₀) = 0**。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c13b9445",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sympy as sp\n",
    "\n",
    "# 定义变量\n",
    "x, y, z = sp.symbols('x y z', integer=True, positive=True) # 假设x, y, z都是正整数\n",
    "n = 3 # 选择一个特定的n值（大于2）\n",
    "\n",
    "# 定义方程\n",
    "equation = x**n + y**n - z**n\n",
    "\n",
    "# 尝试找到满足方程的解\n",
    "# 注意：由于我们是在寻找正整数解，因此可以使用sympy的diophantine方法（如果可用）或者通过遍历一定范围内的整数来寻找解\n",
    "# 但是，对于费马大定理来说，直接遍历整数是不可行的，因为解可能非常大或者根本不存在\n",
    "# 因此，这里我们仅仅展示如何设置方程，并不真正尝试去解它（因为那将是一个无穷大的问题）\n",
    "# 相反，我们可以说，由于费马大定理已经被证明，我们知道对于n>2的情况，这样的解是不存在的\n",
    "\n",
    "# 打印方程\n",
    "print(f\"The equation to solve is: {equation} = 0\")\n",
    "\n",
    "# 由于费马大定理已经被证明，我们知道对于n=3的情况，这样的解是不存在的\n",
    "# 因此，这里不需要真正去解方程，而是可以直接得出结论\n",
    "print(f\"According to Fermat's Last Theorem, there are no positive integer solutions to the equation x^{n} + y^{n} = z^{n} when n > 2.\")\n",
    "print(f\"Therefore, for n = {n}, there are no solutions to the given equation.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "228d18cc",
   "metadata": {},
   "source": [
    "**5.泰勒公式**\n",
    "\n",
    "泰勒公式的一般形式为：\n",
    "\n",
    "f(x) = f(x₀) + f'(x₀)(x - x₀) + (f''(x₀)/2!)(x - x₀)² + (f'''(x₀)/3!)(x - x₀)³ + ... + (f^(n)(x₀)/n!)(x - x₀)ⁿ + Rₙ(x)\n",
    "\n",
    "其中，f^(n)(x₀) 表示函数在点 x₀ 处的 n 阶导数，Rₙ(x) 是余项。\n",
    "\n",
    "泰勒公式提供了一种将复杂函数近似为简单多项式的方法，通过选择适当的展开点和阶数，可以得到较高精度的近似结果。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ade7c228",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sympy as sp\n",
    "\n",
    "# 定义符号变量\n",
    "x, x0 = sp.symbols('x x0')\n",
    "\n",
    "# 定义一个函数 f(x)\n",
    "f = sp.Function('f')(x)\n",
    "\n",
    "# 展开泰勒公式\n",
    "# 这里假设我们要展开到 n 阶，并且 n 是一个具体的数字，比如 4\n",
    "n = 4\n",
    "taylor_series = sum([(f.diff(x, i).subs(x, x0) / sp.factorial(i)) * (x - x0)**i for i in range(n + 1)])\n",
    "\n",
    "# 打印泰勒公式\n",
    "print(taylor_series)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "273a289e",
   "metadata": {},
   "source": [
    "在这个示例中，我们定义了符号变量 `x` 和 `x0`，以及一个函数 `f(x)`。然后，我们使用一个列表推导式来计算泰勒公式的各项，并将它们相加得到泰勒级数。最后，我们打印出泰勒级数。\n",
    "\n",
    "需要注意的是，由于泰勒公式是一个无穷级数，我们在实际应用中通常只能展开到有限项。在上面的示例中，我们选择了展开到 n=4 阶。如果需要更高的精度，可以相应地增加 n 的值。\n",
    "\n",
    "此外，`sympy` 还提供了更高级的函数 `sp.series`，可以直接用于展开函数到指定的阶数："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2f8cdf94",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用 sympy 的 series 函数展开泰勒公式\n",
    "taylor_series_using_series_func = sp.series(f, x, x0, n=n + 1)\n",
    "\n",
    "# 打印结果\n",
    "print(taylor_series_using_series_func)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "587eff63",
   "metadata": {},
   "source": [
    "\n",
    "这个示例使用了 `sp.series` 函数来展开函数 `f(x)` 到 `x0` 点处的 n 阶泰勒级数。注意这里的 n+1 是因为 `sp.series` 函数中的 n 表示展开的项数（包括常数项），而我们上面的列表推导式中的 n 表示最高阶导数的阶数（从 0 阶到 n 阶）。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "50ad0433",
   "metadata": {},
   "source": [
    "**6.积分中值定理**\n",
    "积分中值定理是微积分学中的一个基本定理，它揭示了函数在某个闭区间上的积分与该区间内某一点的函数值之间的关系。积分中值定理分为积分第一中值定理和积分第二中值定理，它们各自包含不同的公式和推论。\n",
    "**积分第一中值定理**表明，若函数在闭区间上连续，则在积分区间上至少存在一个点，使得该点的函数值与区间长度的乘积等于函数在整个区间上的积分值。\n",
    "**积分第二中值定理**则提供了更一般的结论，它涉及函数在积分区间上的加权平均值与某个特定点处的函数值之间的关系。\n",
    "积分中值定理在微积分学及其应用中发挥着重要作用，特别是在求极限、判定某些性质点、估计积分值等方面。它提供了一种将积分化为函数值，或者将复杂函数的积分化为简单函数的积分的方法，从而简化了问题。\n",
    "\n",
    "### 使用sympy表示积分中值定理\n",
    "\n",
    "然而，需要注意的是，`sympy`作为一个符号计算库，并不能直接表示或证明积分中值定理这样的数学定理。但我们可以使用`sympy`来进行相关的符号计算和积分运算，以辅助理解和应用积分中值定理。\n",
    "\n",
    "以下是一个使用`sympy`进行符号计算和积分运算的示例，虽然它并不直接表示积分中值定理，但可以帮助我们理解定理中的积分和函数值之间的关系："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "dc6ff8ec",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sympy as sp\n",
    "\n",
    "# 定义符号变量\n",
    "x = sp.symbols('x')\n",
    "a, b = sp.symbols('a b', real=True, positive=True) # 假设a和b是正实数\n",
    "\n",
    "# 定义一个函数f(x)\n",
    "f = x**2 # 以x^2为例，可以是任何连续函数\n",
    "\n",
    "# 计算定积分\n",
    "integral = sp.integrate(f, (x, a, b))\n",
    "\n",
    "# 打印定积分结果\n",
    "print(f\"The definite integral of f(x) from a to b is: {integral}\")\n",
    "\n",
    "# 假设积分中值定理中的点xi存在，我们不知道它的确切值，但我们可以表示它\n",
    "xi = sp.symbols('xi')\n",
    "\n",
    "# 根据积分中值定理，存在xi使得：int_a^b f(x) dx = f(xi) * (b - a)\n",
    "# 我们可以解这个方程来找到xi（但实际上，我们通常不会这样做，因为这是一个超越方程）\n",
    "# 但为了演示，我们可以设置一个等式来表示这个关系\n",
    "equation = sp.Eq(integral, f.subs(x, xi) * (b - a))\n",
    "\n",
    "# 打印等式\n",
    "print(f\"According to the Mean Value Theorem for Integrals, there exists xi such that: {equation}\")\n",
    "\n",
    "# 注意：上面的等式是一个方程，我们并没有解它，因为解这个方程通常很困难（甚至不可能）\n",
    "# 在实际应用中，我们不会尝试去解xi，而是会使用积分中值定理的结论来简化问题或进行估计"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf8fadfc",
   "metadata": {},
   "source": [
    "在这个示例中，我们定义了符号变量x、a、b和xi，以及一个函数f(x)。我们计算了函数f(x)在区间[a, b]上的定积分，并设置了一个等式来表示积分中值定理的结论。然而，请注意，我们并没有尝试去解这个等式来找到xi的确切值，因为在实际应用中，我们通常不会这样做。相反，我们会使用积分中值定理的结论来简化问题或进行估计。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "357b4338",
   "metadata": {},
   "source": [
    "### 例题\n",
    "\n",
    "给定一个函数 $ f(x) $，该函数满足以下条件：\n",
    "\n",
    "1. $ f(x) $ 在区间 $[0, 1]$ 上连续，在区间 $(0, 1)$ 内可导。\n",
    "2. $ f(0) = f(1) = 0 $ 且 $ f\\left(\\frac{1}{2}\\right) = 1 $。\n",
    "\n",
    "证明存在两个不同的点 $ x_1, x_2 \\in (0, 1) $，使得 $ f'(x_1) = 0 $ 且 $ f'(x_2) = f(x_2) - 1 $。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "98d46376",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sympy as sp\n",
    "\n",
    "# 定义符号变量\n",
    "x = sp.symbols('x')\n",
    "\n",
    "# 假设 f(x) 是一个未知的函数，我们用一个符号表达式来表示它（这里用多项式作为示例）\n",
    "# 实际上，我们不知道 f(x) 的具体形式，但可以用一个多项式来近似或分析\n",
    "# 注意：这里的多项式只是为了展示如何使用SymPy，并不是题目要求的函数形式\n",
    "n = 4  # 多项式的阶数（可以调整）\n",
    "coeffs = sp.symbols(f'c:{n+1}')  # 多项式的系数（未知）\n",
    "f = sum(coeffs[i] * x**i for i in range(n+1))\n",
    "\n",
    "# 定义条件\n",
    "condition1 = f.subs(x, 0)  # f(0) = 0\n",
    "condition2 = f.subs(x, 1)  # f(1) = 0\n",
    "condition3 = f.subs(x, 1/2) - 1  # f(1/2) = 1\n",
    "\n",
    "# 解方程组找到多项式的系数（但这并不是我们真正要做的，因为题目没有要求具体形式）\n",
    "# 而且，由于我们只有一个点 f(1/2)=1 和两个边界条件 f(0)=0, f(1)=0，\n",
    "# 所以这个方程组是欠定的，无法唯一确定多项式的系数。\n",
    "# 这里只是为了展示如何使用SymPy解方程组，所以我们会得到一个包含自由参数的解。\n",
    "solutions = sp.solve((condition1, condition2, condition3), coeffs)\n",
    "\n",
    "# 由于我们无法得到 f(x) 的确切形式，我们无法直接找到满足 f'(x1)=0 和 f'(x2)=f(x2)-1 的点。\n",
    "# 但我们可以分析 f'(x) 和 f(x)-x-1（为了找到 f'(x)=f(x)-1 的点，我们考虑函数 g(x)=f(x)-x，然后求 g'(x)）\n",
    "f_prime = sp.diff(f, x)  # f(x) 的导数\n",
    "g = f - x  # 定义新函数 g(x) = f(x) - x\n",
    "g_prime = sp.diff(g, x)  # g(x) 的导数\n",
    "\n",
    "# 我们无法直接找到满足条件的 x1 和 x2，但我们可以分析函数的行为。\n",
    "# 例如，我们可以找到 f'(x) 的零点（即可能的极值点）和 g'(x) 的零点（即满足 f'(x)=f(x)-1 的点，如果我们将 g(x) 看作 f(x)-x 的话）。\n",
    "# 然而，由于我们不知道 f(x) 的确切形式，这些零点将取决于多项式的系数，而我们无法唯一确定这些系数。\n",
    "\n",
    "# 因此，以下代码只是展示了如何使用SymPy找到 f'(x) 和 g'(x) 的零点（如果存在的话）：\n",
    "# 注意：这些零点可能不存在于 (0,1) 区间内，或者可能存在多个，这取决于 f(x) 的具体形式。\n",
    "# 而且，由于我们使用的是多项式近似，所以这些零点可能并不准确。\n",
    "\n",
    "# 找到 f'(x) 的零点（即可能的极值点）\n",
    "# 注意：这里我们并没有限制 x 在 (0,1) 区间内，因为 SymPy 无法直接处理这种限制。\n",
    "# 我们需要手动检查得到的解是否在 (0,1) 区间内。\n",
    "critical_points_f_prime = sp.solve(f_prime, x)\n",
    "\n",
    "# 找到 g'(x) 的零点（即满足 f'(x)=f(x)-1 的点，如果看作 g(x)=f(x)-x 的话）\n",
    "# 同样地，这里我们并没有限制 x 在 (0,1) 区间内。\n",
    "critical_points_g_prime = sp.solve(g_prime - (f - 1), x)  # 注意这里 f-1 是因为我们要找 f'(x)=f(x)-1 的点\n",
    "\n",
    "# 打印结果（注意：这些结果可能不准确，因为我们使用的是多项式近似，并且没有限制 x 在 (0,1) 区间内）\n",
    "print(\"Critical points of f'(x):\", critical_points_f_prime)\n",
    "print(\"Critical points of g'(x) (i.e., points where f'(x) = f(x) - 1 if considered as g(x) = f(x) - x):\", critical_points_g_prime)\n",
    "\n",
    "# 重要提示：由于我们不知道 f(x) 的确切形式，并且使用的是多项式近似，\n",
    "# 所以上述代码得到的结果可能并不准确或不适用于本题。\n",
    "# 本题要求证明存在性，而不是具体求解，因此需要使用其他数学方法（如中值定理、罗尔定理等）来证明。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ea940a54",
   "metadata": {},
   "source": [
    "### 例题\n",
    "已知函数 $f(x)$ 在区间 $(0,1)$ 内三阶可导，且 $x \\in [0,1]$，同时满足 $f(1) = 0$。定义函数 $F(x) = x^2f(x)$，证明：存在某个 $x \\in (0,1)$，使得 $F''(x) = 0$。\n",
    "\n",
    "要使用SymPy（一个Python的符号数学库）来证明存在某个 $x \\in (0,1)$ 使得 $F''(x) = 0$，我们首先需要计算 $F(x)$ 的一阶和二阶导数，并分析它们的行为。然而，SymPy本身并不能直接证明存在性定理（如罗尔定理或中值定理），但我们可以使用它来辅助计算和分析。\n",
    "\n",
    "以下是使用SymPy来计算 $F(x)$ 的一阶和二阶导数，并尝试通过分析这些导数来证明存在性的步骤："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a3169ba9",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sympy as sp\n",
    "\n",
    "# 定义符号变量\n",
    "x = sp.symbols('x')\n",
    "\n",
    "# 定义函数f(x)（注意：这里f(x)是未知的，但我们假设它是三阶可导的）\n",
    "f = sp.Function('f')(x)\n",
    "\n",
    "# 定义函数F(x)\n",
    "F = x**2 * f\n",
    "\n",
    "# 计算F(x)的一阶导数\n",
    "F_prime = sp.diff(F, x)\n",
    "\n",
    "# 计算F(x)的二阶导数\n",
    "F_double_prime = sp.diff(F_prime, x)\n",
    "\n",
    "# 打印结果\n",
    "print(\"F(x) =\", F)\n",
    "print(\"F'(x) =\", F_prime)\n",
    "print(\"F''(x) =\", F_double_prime)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7fda4a84",
   "metadata": {},
   "source": [
    "运行上述代码后，我们将得到 $F(x)$、$F'(x)$ 和 $F''(x)$ 的表达式。接下来，我们需要分析这些表达式来证明存在性。但是，由于 $f(x)$ 是未知的，我们不能直接计算出 $F''(x)$ 的具体零点。相反，我们将使用数学推理。\n",
    "\n",
    "分析步骤：\n",
    "\n",
    "1. **计算导数**：\n",
    "   - $F'(x) = 2xf(x) + x^2f'(x)$\n",
    "   - $F''(x) = 2f(x) + 4xf'(x) + x^2f''(x)$\n",
    "\n",
    "2. **应用罗尔定理**：\n",
    "   - 我们知道 $F(0) = 0$（因为 $0^2f(0) = 0$，无论 $f(0)$ 的值是多少）。\n",
    "   - 我们也知道 $F(1) = 1^2f(1) = 0$（因为 $f(1) = 0$）。\n",
    "   - 因此，函数 $F(x)$ 在区间 $[0,1]$ 的两个端点上取相同的值。\n",
    "\n",
    "3. **分析 $F'(x)$**：\n",
    "   - 如果 $F'(x)$ 在 $(0,1)$ 内始终为正或始终为负，则 $F(x)$ 在 $(0,1)$ 内单调增加或减少，这与 $F(0) = F(1) = 0$ 矛盾。\n",
    "   - 因此，存在某个 $c \\in (0,1)$，使得 $F'(c) = 0$。然而，这一步并不能直接证明 $F''(x)$ 在 $(0,1)$ 内有零点。\n",
    "\n",
    "4. **分析 $F''(x)$**：\n",
    "   - 由于 $F''(x)$ 是连续的（因为 $f(x)$ 是三阶可导的），并且 $F'(x)$ 在 $(0,1)$ 内至少改变一次符号（由罗尔定理保证），根据中值定理的推论，我们可以推断出 $F''(x)$ 在 $(0,1)$ 内至少有一个零点。\n",
    "\n",
    "但是，请注意，上述分析中的最后一步（从 $F'(x)$ 的符号变化推断出 $F''(x)$ 的零点）并不是由SymPy直接给出的，而是基于数学定理和逻辑推理得出的。SymPy在这里的作用是帮助我们计算导数，而实际的证明过程需要数学知识和逻辑推理。\n",
    "\n",
    "因此，虽然我们不能直接用SymPy来“证明”存在性，但我们可以使用它来辅助我们的计算和推理过程。最终，我们得出结论：存在某个 $x \\in (0,1)$，使得 $F''(x) = 0$。这个结论是基于罗尔定理和中值定理的推论得出的，而不是直接由SymPy计算得出的。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
